load("@bazel_gazelle//:def.bzl", "gazelle")
load("@com_github_atlassian_bazel_tools//gometalinter:def.bzl", "gometalinter")
load("@com_github_atlassian_bazel_tools//goimports:def.bzl", "goimports")
load("@io_kubernetes_build//defs:run_in_workspace.bzl", "workspace_binary")
load("@io_bazel_rules_go//go:def.bzl", "nogo")
load("@bazel_skylib//rules:common_settings.bzl", "string_setting")
load("@prysm//tools/nogo_config:def.bzl", "nogo_config_exclude")

prefix = "github.com/OffchainLabs/prysm"

exports_files([
    "LICENSE.md",
])

# gazelle:prefix github.com/OffchainLabs/prysm/v7
# gazelle:map_kind go_library go_library @prysm//tools/go:def.bzl
# gazelle:map_kind go_test go_test @prysm//tools/go:def.bzl
# gazelle:map_kind go_repository go_repository @prysm//tools/go:def.bzl
# gazelle:build_tags bazel
# gazelle:exclude tools/analyzers/**/testdata/**
gazelle(
    name = "gazelle",
    prefix = prefix,
)

# Protobuf compiler (non-gRPC)
alias(
    name = "proto_compiler",
    actual = "@io_bazel_rules_go//proto:go_proto",
    visibility = [
        "//proto:__subpackages__",
    ],
)

# Cast protobuf compiler (non-gRPC)
alias(
    name = "cast_proto_compiler",
    actual = "@com_github_prysmaticlabs_protoc_gen_go_cast//:go_cast",
    visibility = [
        "//proto:__subpackages__",
    ],
)

# Protobuf compiler (gRPC)
alias(
    name = "grpc_proto_compiler",
    actual = "@io_bazel_rules_go//proto:go_grpc",
    visibility = ["//visibility:public"],
)

# Cast protobuf compiler (gRPC)
alias(
    name = "cast_grpc_proto_compiler",
    actual = "@com_github_prysmaticlabs_protoc_gen_go_cast//:go_cast_grpc",
    visibility = ["//visibility:public"],
)

gometalinter(
    name = "gometalinter",
    config = "//:.gometalinter.json",
    paths = [
        "./...",
    ],
    prefix = prefix,
)

goimports(
    name = "goimports",
    display_diffs = True,
    prefix = prefix,
    write = False,
)

workspace_binary(
    name = "golint",
    cmd = "@com_github_golang_lint//golint",
)

STATICCHECK_ANALYZERS = [
    # Enabled static checks. See https://staticcheck.dev/docs/checks/
    # Please. keep this list sorted. Don't be a bad person by inserting stuff randomly.
    "sa1000",
    "sa1001",
    "sa1002",
    "sa1003",
    "sa1004",
    "sa1005",
    "sa1006",
    "sa1007",
    "sa1008",
    "sa1010",
    "sa1011",
    "sa1012",
    "sa1013",
    "sa1014",
    "sa1015",
    "sa1016",
    "sa1017",
    "sa1018",
    # "sa1019", # TODO: Fix all uses of deprecated things.
    "sa1020",
    "sa1021",
    "sa1023",
    "sa1024",
    "sa1025",
    "sa1026",
    "sa1027",
    "sa1028",
    "sa1029",
    "sa1030",
    "sa2000",
    "sa2001",
    "sa2002",
    "sa2003",
    "sa3000",
    "sa3001",
    "sa4000",
    "sa4001",
    "sa4003",
    "sa4004",
    "sa4005",
    "sa4006",
    "sa4008",
    "sa4009",
    "sa4010",
    "sa4011",
    "sa4012",
    "sa4013",
    "sa4014",
    "sa4015",
    "sa4016",
    "sa4017",
    "sa4018",
    "sa4019",
    "sa4020",
    "sa4021",
    "sa4022",
    "sa4023",
    "sa4024",
    "sa4025",
    "sa4026",
    "sa4027",
    "sa4028",
    "sa4029",
    "sa4030",
    "sa4031",
    "sa4032",
    "sa5000",
    "sa5001",
    "sa5002",
    "sa5003",
    "sa5004",
    "sa5005",
    "sa5007",
    "sa5008",
    "sa5009",
    "sa5010",
    "sa5011",
    "sa5012",
    "sa6000",
    "sa6001",
    "sa6002",
    "sa6003",
    "sa6005",
    "sa6006",
    "sa9001",
    "sa9002",
    "sa9003",
    "sa9004",
    "sa9005",
    "sa9006",
    "sa9007",
    "sa9008",
]

nogo_config_exclude(
    name = "nogo_config_with_excludes",
    checks = [sa.upper() for sa in STATICCHECK_ANALYZERS],
    exclude_files = [
        "external/.*",
    ],
    input = "nogo_config.json",
)

nogo(
    name = "nogo",
    config = ":nogo_config_with_excludes",
    visibility = ["//visibility:public"],
    deps = [
        "//tools/analyzers/comparesame:go_default_library",
        "//tools/analyzers/cryptorand:go_default_library",
        "//tools/analyzers/errcheck:go_default_library",
        "//tools/analyzers/featureconfig:go_default_library",
        "//tools/analyzers/gocognit:go_default_library",
        "//tools/analyzers/ineffassign:go_default_library",
        "//tools/analyzers/interfacechecker:go_default_library",
        "//tools/analyzers/logcapitalization:go_default_library",
        "//tools/analyzers/logruswitherror:go_default_library",
        "//tools/analyzers/maligned:go_default_library",
        "//tools/analyzers/modernize/any:go_default_library",
        "//tools/analyzers/modernize/appendclipped:go_default_library",
        "//tools/analyzers/modernize/bloop:go_default_library",
        "//tools/analyzers/modernize/fmtappendf:go_default_library",
        "//tools/analyzers/modernize/forvar:go_default_library",
        "//tools/analyzers/modernize/mapsloop:go_default_library",
        "//tools/analyzers/modernize/minmax:go_default_library",
        #"//tools/analyzers/modernize/newexpr:go_default_library", # Disabled until go 1.26.
        "//tools/analyzers/modernize/omitzero:go_default_library",
        "//tools/analyzers/modernize/rangeint:go_default_library",
        "//tools/analyzers/modernize/reflecttypefor:go_default_library",
        "//tools/analyzers/modernize/slicescontains:go_default_library",
        #"//tools/analyzers/modernize/slicesdelete:go_default_library", # Disabled, see https://go.dev/issue/73686
        "//tools/analyzers/modernize/slicessort:go_default_library",
        "//tools/analyzers/modernize/stringsbuilder:go_default_library",
        "//tools/analyzers/modernize/stringscutprefix:go_default_library",
        "//tools/analyzers/modernize/stringsseq:go_default_library",
        "//tools/analyzers/modernize/testingcontext:go_default_library",
        "//tools/analyzers/modernize/waitgroup:go_default_library",
        "//tools/analyzers/nop:go_default_library",
        "//tools/analyzers/nopanic:go_default_library",
        "//tools/analyzers/properpermissions:go_default_library",
        "//tools/analyzers/recursivelock:go_default_library",
        "//tools/analyzers/shadowpredecl:go_default_library",
        "//tools/analyzers/slicedirect:go_default_library",
        "//tools/analyzers/uintcast:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/appends:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/asmdecl:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/assign:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/atomic:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/atomicalign:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/bools:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/buildssa:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/buildtag:go_default_library",
        # cgocall disabled
        #"@org_golang_x_tools//go/analysis/passes/cgocall:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/copylock:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/ctrlflow:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/deepequalerrors:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/defers:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/directive:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/errorsas:go_default_library",
        # fieldalignment disabled
        #"@org_golang_x_tools//go/analysis/passes/fieldalignment:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/findcall:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/framepointer:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/httpmux:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/httpresponse:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/ifaceassert:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/inspect:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/loopclosure:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/nilfunc:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/nilness:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/pkgfact:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/printf:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/reflectvaluecompare:go_default_library",
        # shadow disabled
        #"@org_golang_x_tools//go/analysis/passes/shadow:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/shift:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/sigchanyzer:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/slog:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/sortslice:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/stdmethods:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/stringintconv:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/structtag:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/testinggoroutine:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/tests:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/timeformat:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/unmarshal:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/unreachable:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/unsafeptr:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/unusedresult:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/unusedwrite:go_default_library",
        "@org_golang_x_tools//go/analysis/passes/usesgenerics:go_default_library",
    ] + select({
        # nogo checks that fail with coverage enabled.
        ":coverage_enabled": [],
        "//conditions:default": [
            "@org_golang_x_tools//go/analysis/passes/composite:go_default_library",
            "@org_golang_x_tools//go/analysis/passes/lostcancel:go_default_library",
        ],
    }) + ["@co_honnef_go_tools//staticcheck/%s:go_default_library" % c for c in STATICCHECK_ANALYZERS],
)

config_setting(
    name = "coverage_enabled",
    values = {"define": "coverage_enabled=1"},
)

config_setting(
    name = "pgo_enabled",
    values = {"define": "pgo_enabled=1"},
)

common_files = {
    "//:LICENSE.md": "LICENSE.md",
    "//:README.md": "README.md",
}

sh_binary(
    name = "prysm_sh",
    srcs = ["prysm.sh"],
    visibility = ["//visibility:public"],
)
